# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/16 19:51 
@Author  : ZhangShenao 
@File    : mock.py 
@Desc    : 使用Mock进行测试

Mock的含义:通过构造一个虚假的对象,来代替被测试函数或模块所依赖的对象
Mock机制可以便于单元测试忽略依赖项,聚焦于核心逻辑
如数据库访问、网络调用等复杂的外部逻辑,我们可以通过Mock机制屏蔽掉这些细节,只关注业务的核心处理流程

Python中的Mock功能,主要借助mock或者MagicMock对象来实现

"""
import unittest
from unittest.mock import MagicMock


class A(unittest.TestCase):
    """测试用例类"""

    def m1(self):
        """业务核心处理逻辑,需要进行单元测试"""
        val = self.m2()
        self.m3(val)

    def m2(self) -> str:
        """模拟内部的复杂方法"""
        pass

    def m3(self, val) -> None:
        """模拟内部的复杂方法"""
        pass

    def test_m1(self):
        """m1方法的测试用例"""

        # 创建A实例
        a = A()

        # Mock m2方法,并设置自定义返回值
        a.m2 = MagicMock(return_value='custom m2 return value')

        # Mock m3方法
        a.m3 = MagicMock()

        # 执行m1方法
        a.m1()

        # 验证m2确实被调用过
        self.assertTrue(a.m2.called)

        # 验证m3确实被指定参数调用过
        a.m3.assert_called_with('custom m2 return value')


if __name__ == '__main__':
    # 执行测试用例
    unittest.main()
